package com.zhanglijie.base.threadPool;

import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author zhanglijie
 * @version 1.0
 * @since 1.1.0 2022/7/5 0005 22:28
 * 注意 shutdownnow（）会清空阻塞队列的任务 + 中断正在执行的任务
 * 但是中断正在执行的任务是有前提的：任务中必须有像sleep wait的中断类型代码，如果没有任务还会执行完线程才会结束但是队列是清掉的
 */
public class ShutDownAndShutDownNow {
    public static void main(String[] args) {
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2,14,1, TimeUnit.SECONDS,new LinkedBlockingQueue<>(15));
        for (int i = 0; i < 15; i++) {
            threadPool.submit(()->{
                System.out.println(Thread.currentThread().getName()+"====>中断前执行代码");
               // mysleep(2000000000);//这个不会中断
                try{
                    Thread.sleep(1000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"====>中断后执行代码");
            });
        }
        // threadPool.shutdown();
        // BlockingQueue<Runnable> queue = threadPool.getQueue();
        // int size = queue.remainingCapacity();
        // System.out.println("队列剩余长度多少"+size); //2
        List<Runnable> runnables = threadPool.shutdownNow();
        System.out.println("剩余的任务"+runnables.size());//打印队列里没有执行的任务数量+并且还会抛出两个正在执行任务的中断信息(中断前提runnable中必须捕获中断异常）

    }
    /**
     * @param timeout 单位是纳秒
     */
    private static void mysleep(int timeout) {
        long start = System.nanoTime();
        long end;
        do{
            end = System.nanoTime();
        }while(end-start<=timeout);
    }
}
